package com.atguigu.tingshu.album.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.common.utils.CollectionUtils;
import com.atguigu.tingshu.album.mapper.*;
import com.atguigu.tingshu.album.service.BaseCategoryService;
import com.atguigu.tingshu.common.execption.GuiguException;
import com.atguigu.tingshu.model.album.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
@SuppressWarnings({"all"})
public class BaseCategoryServiceImpl extends ServiceImpl<BaseCategory1Mapper, BaseCategory1> implements BaseCategoryService {

	@Autowired
	private BaseCategory1Mapper baseCategory1Mapper;

	@Autowired
	private BaseCategory2Mapper baseCategory2Mapper;

	@Autowired
	private BaseCategory3Mapper baseCategory3Mapper;


	@Autowired
	private BaseCategoryViewMapper baseCategoryViewMapper;

	/**
	 * 查询所有分类（1、2、3级分类）
	 * 1.执行查询
	 * 2.涉及到几张表base_category1 base_category2 base_category3
	 * 3.关系 两个一对多
	 * 4.写多表查询语句
	 * 5. 选择通用mapper还是xml
	 *
	 *
	 * @return
	 */
	@Override
	public List<JSONObject> getBaseCategoryList() {

		//创建封装数据集合
		List<JSONObject> list=new ArrayList<>();

		//获取所有分类数据
		List<BaseCategoryView> baseCategoryViewList = baseCategoryViewMapper.selectList(null);

		//去重-分组
		Map<Long, List<BaseCategoryView>> category1Map = baseCategoryViewList.stream().collect(Collectors.groupingBy(baseCategoryView -> baseCategoryView.getCategory1Id()));

		//遍历集合，处理一级分类数据
		for (Map.Entry<Long, List<BaseCategoryView>> entry1 : category1Map.entrySet()) {

			//创建一级分类封装对象
			JSONObject object1 = new JSONObject();
			Long category1Id = entry1.getKey();
			//封装一级分类ID
			object1.put("categoryId",category1Id);
			//获取当前一级分类下所有二级分类的集合
			List<BaseCategoryView> category2List = entry1.getValue();

			String category1Name = category2List.get(0).getCategory1Name();
			//封装一级分类name
			object1.put("categoryName",category1Name);

			//创建二级分类封装集合
			List<JSONObject> list2=new ArrayList<>();

			//对二级分类数据去重-分组处理
			Map<Long, List<BaseCategoryView>> category2Map = category2List.stream().collect(Collectors.groupingBy(baseCategoryView -> baseCategoryView.getCategory2Id()));

			//处理并遍历二级分类数据
			for (Map.Entry<Long, List<BaseCategoryView>> entry2 : category2Map.entrySet()) {

				//创建二级分类封装对象
				JSONObject object2 = new JSONObject();

				object2.put("categoryId",entry2.getKey());
				//获取当前二级分类关联的所有三级分类
				List<BaseCategoryView> category3List = entry2.getValue();
				object2.put("categoryName",category3List.get(0).getCategory2Name());

				//封装三级分类集合数据
				List<JSONObject> list3 = category3List.stream().map(baseCategoryView -> {

					//创建三级分类封装对象
					JSONObject object3 = new JSONObject();
					object3.put("categoryId", baseCategoryView.getCategory3Id());
					object3.put("categoryName", baseCategoryView.getCategory3Name());

					return object3;
				}).collect(Collectors.toList());
				//封装的是三级分类集合
				object2.put("categoryChild",list3);

				//封装收集二级分类对象
				list2.add(object2);
			}


			//封装一级分类categoryChild
			object1.put("categoryChild",list2);


			//封装一级分类对象
			list.add(object1);

		}


		return list;
	}

	@Autowired
	private BaseAttributeMapper baseAttributeMapper;

	/**
	 * 根据一级分类Id获取分类属性（标签）列表
	 * @param category1Id
	 * @return
	 * 1.查询--
	 * 2.数据源--mysql
	 * 3.涉及表--base_attribute base_attribute_value
	 * 4.写sql
	 * 5.选择mapper xml
	 *
	 *
	 */
	@Override
	public List<BaseAttribute> findAttribute(Long category1Id) {


		return baseAttributeMapper.selectAttribute(category1Id);
	}

	/**
	 * 根据三级分类Id 获取到分类信息
	 * @param category3Id
	 * @return
	 */
	@Override
	public BaseCategoryView getCategoryView(Long category3Id) {
		return baseCategoryViewMapper.selectById(category3Id);
	}


	/**
	 * 根据一级分类Id查询三级分类列表
	 *
	 * @param category1Id
	 * @return
	 * 1.查询
	 * 2.数据源 mysql
	 * 3.涉及到几张表
	 *   id , name
	 *   一级--->二级--->三级
	 *  根据一级ID查询二级列表
	 *  根据二级ID列表查询三级列表
	 *
	 */
	@Override
	public List<BaseCategory3> findTopBaseCategory3(Long category1Id) {

		//根据一级ID查询二级列表
		List<BaseCategory2> baseCategory2List = baseCategory2Mapper.selectList(new QueryWrapper<BaseCategory2>().eq("category1_id", category1Id));
		//判断
		if(CollectionUtils.isEmpty(baseCategory2List)){
			throw new GuiguException(500,"您的网路不稳定，请刷新一下");
		}
		//处理二级分类列表，获取二级分类id列表
		List<Long> baseCategory2Ids = baseCategory2List.stream().map(baseCategory2 -> baseCategory2.getId()).collect(Collectors.toList());

		//根据二级ID列表查询三级列表
		//is_top:可以设置三级分类是否置顶，只有置顶才有可能在首页热门分类中显示
		//order_num:设置三级分类在首页显示时的位置
		//select*from base_category3 where category2_id in(?,?) and is_top=1 order by order_num asc limit 7

		//构建查询条件
		LambdaQueryWrapper<BaseCategory3> queryWrapper = new LambdaQueryWrapper<>();

		queryWrapper.in(BaseCategory3::getCategory2Id,baseCategory2Ids);
		queryWrapper.eq(BaseCategory3::getIsTop,1);
		queryWrapper.orderByAsc(BaseCategory3::getOrderNum);
		queryWrapper.last(" limit 7 ");

		//执行查询
		return baseCategory3Mapper.selectList(queryWrapper);
	}

	/**
	 * 据一级分类id获取全部分类信息
	 * @param category1Id
	 * @return
	 */
	@Override
	public JSONObject getBaseCategoryList(Long category1Id) {

		//获取所以一二三级分类信息
		List<JSONObject> categoryList = this.getBaseCategoryList();
		//遍历获取指定的一级分类下的所有数据
		for (JSONObject jsonObject : categoryList) {

			Long categoryId = (Long) jsonObject.get("categoryId");
			//判断
			if(category1Id.intValue()==categoryId.intValue()){

				return jsonObject;
			}

		}


		return null;
	}
}
